Skip to content

[Week3] 알고리즘 코치를 mock 도구에서 문서 기반 RAG로 전환#13

Open
pykido wants to merge 4 commits into
mainfrom
pykido/week3-domain-rag
Open

[Week3] 알고리즘 코치를 mock 도구에서 문서 기반 RAG로 전환#13
pykido wants to merge 4 commits into
mainfrom
pykido/week3-domain-rag

Conversation

@pykido

@pykido pykido commented Jun 6, 2026

Copy link
Copy Markdown
Collaborator

과제 수행 내용 요약

저번 과제까지 알고리즘 패턴과 문제 정보를 tools.py 안의 mock dict 형태로 들고 있었습니다. 이번 주에는 그 지식을 마크다운 문서 20개(알고리즘 패턴 12 + 알고리즘 문제 8)로 만들고, 키워드 매칭이 아니라 의미 기반 검색으로 답하는 RAG 파이프라인으로 교체했습니다. 흐름은 문서 로드 → 청킹 → 임베딩 → FAISS → retriever → 2-step 그래프(retrieve → generate)로, 단계별로 파일 하나씩 책임을 나눴습니다.

코퍼스(검색 대상이 되는 자료더미)는 새로 지어내지 않고 2주차에서 이미 검증된 패턴/문제 내용을 마크다운으로 확장했습니다. 덕분에 알고리즘 설명이 틀릴 위험이 적었고, 코드 9개는 직접 실행해 정답과 대조했습니다. 답변은 검색된 문서만 근거로 gpt-4o-mini가 생성하되, 근거 문서(sources)는 LLM이 지어내는 대신 실제 검색 결과에서 직접 뽑아 붙이도록 해서 '근거 없는 답"'을 구조적으로 막았습니다.

청킹 전략 비교

recursive(700자 길이 분할)와 markdown(헤더 기준 분할) 두 전략을 같은 쿼리로 비교했습니다.

  1. recursive는 길이로 자르다 보니 코드 블록이 본문과 섞이고, 모든 문서가 공유하는 ## 흔한 실수 같은 섹션이 어휘 유사도 때문에 엉뚱한 문서에서 상위로 끌려오는 노이즈가 컸습니다.
  2. 반면 markdown은 개념·접근·실수를 각각 온전한 청크로 유지해, "개념이나 문제를 설명하라"는 이 도메인의 질문에서 훨씬 집중적인 context를 줬습니다. 같은 임베딩·같은 질문이어도 자르는 기준 하나가 검색 품질을 크게 좌우한다는 걸 직접 확인했고, 그래서 기본 전략으로 markdown을 택했습니다.

결과

최종 질문 6개(입국심사의 이분탐색, 보석쇼핑의 while 축소, 디스크컨트롤러 자료구조, 섬연결의 union-find, DFS와 최단거리, 등굣길 DP 상태)를 돌려 전부 검색 문서에 근거해 정확히 답했고, sources와 confidence를 함께 출력했습니다.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Mock dict로 유지하던 알고리즘 코치 지식을 마크다운 문서 코퍼스로 전환하고, 의미 기반 검색(임베딩 + FAISS)으로 근거 문서 기반 답변을 생성하는 Week3 RAG 파이프라인을 구성합니다. 문서 로드/청킹/인덱싱/검색/생성 단계를 파일 단위로 분리하고, recursive vs markdown-header 청킹 전략 비교까지 포함합니다.

Changes:

  • 알고리즘 패턴/문제 지식을 20개 마크다운 문서로 구성하고 로더/스플리터로 코퍼스화
  • OpenAI 임베딩 + FAISS 인덱싱 및 retriever 기반 검색 파이프라인 추가
  • LangGraph 2-step(retrieve → generate) 그래프로 RAG Q&A 실행 및 전략 비교 스크립트/노트북 추가

Reviewed changes

Copilot reviewed 31 out of 31 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
assignments/pykido/week3/state.py RAG 그래프 상태(TypedDict) 정의 추가
assignments/pykido/week3/schema.py RAG 응답 스키마(Pydantic) 정의 추가
assignments/pykido/week3/run.ipynb 코퍼스 로드→청킹→인덱싱→검색 비교→그래프 실행 데모 노트북 추가
assignments/pykido/week3/rag/init.py Week3 데이터/인덱스 디렉토리 및 전략 상수 정의
assignments/pykido/week3/rag/loader.py data/ 아래 md 문서 로드 및 메타데이터 부여
assignments/pykido/week3/rag/splitter.py recursive/markdown-header 청킹 전략 구현
assignments/pykido/week3/rag/vectorstore.py 임베딩/FAISS 벡터스토어 build/save/load 구현
assignments/pykido/week3/rag/retriever.py FAISS retriever 기반 의미 검색 API 추가
assignments/pykido/week3/rag/indexing.py 전략별 인덱싱 수행 및 캐시 저장 스크립트 추가
assignments/pykido/week3/graph.py retrieve→generate 2-step LangGraph 기반 RAG 그래프/ask API 추가
assignments/pykido/week3/compare_chunking.py 동일 쿼리로 전략별 top-k 검색 결과 비교 스크립트 추가
assignments/pykido/week3/data/problems/pgs-67258-gem-shopping.md 문제 문서(보석 쇼핑) 추가
assignments/pykido/week3/data/problems/pgs-43238-immigration.md 문제 문서(입국심사) 추가
assignments/pykido/week3/data/problems/pgs-43236-stepping-stones.md 문제 문서(징검다리) 추가
assignments/pykido/week3/data/problems/pgs-43165-target-number.md 문제 문서(타겟 넘버) 추가
assignments/pykido/week3/data/problems/pgs-42898-school-path.md 문제 문서(등굣길) 추가
assignments/pykido/week3/data/problems/pgs-42861-connecting-islands.md 문제 문서(섬 연결하기) 추가
assignments/pykido/week3/data/problems/pgs-42627-disk-controller.md 문제 문서(디스크 컨트롤러) 추가
assignments/pykido/week3/data/problems/pgs-118667-two-queues.md 문제 문서(두 큐 합 같게 만들기) 추가
assignments/pykido/week3/data/patterns/backtracking.md 패턴 문서(백트래킹) 추가
assignments/pykido/week3/data/patterns/bfs-dfs.md 패턴 문서(BFS/DFS) 추가
assignments/pykido/week3/data/patterns/binary-search.md 패턴 문서(이분 탐색) 추가
assignments/pykido/week3/data/patterns/dijkstra.md 패턴 문서(다익스트라) 추가
assignments/pykido/week3/data/patterns/dp.md 패턴 문서(DP) 추가
assignments/pykido/week3/data/patterns/greedy.md 패턴 문서(그리디) 추가
assignments/pykido/week3/data/patterns/hash-map.md 패턴 문서(해시 맵) 추가
assignments/pykido/week3/data/patterns/heap.md 패턴 문서(힙) 추가
assignments/pykido/week3/data/patterns/prefix-sum.md 패턴 문서(누적 합) 추가
assignments/pykido/week3/data/patterns/sliding-window.md 패턴 문서(슬라이딩 윈도우) 추가
assignments/pykido/week3/data/patterns/two-pointers.md 패턴 문서(투 포인터) 추가
assignments/pykido/week3/data/patterns/union-find.md 패턴 문서(유니온 파인드) 추가

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +5 to +14
from .vectorstore import load_vectorstore


@lru_cache(maxsize=None)
def _store(strategy: str):
return load_vectorstore(strategy)


def retrieve(query: str, strategy: str = "markdown", k: int = 4) -> list[Document]:
return _store(strategy).as_retriever(search_kwargs={"k": k}).invoke(query)
Comment on lines +28 to +36
def load_vectorstore(strategy: str) -> FAISS:
path = INDEX_DIR / strategy
if not path.exists():
raise FileNotFoundError(f"index not found: {path}. run indexing.py first.")
return FAISS.load_local(
str(path),
get_embeddings(),
allow_dangerous_deserialization=True,
)
Comment on lines +1 to +11
from typing import Optional, TypedDict

from langchain_core.documents import Document


class RAGState(TypedDict):
question: str
strategy: str
documents: list[Document]
context: str
final_answer: Optional[dict]
Comment on lines +7 to +11
answer: str = Field(description="한국어 마크다운 답변. context 근거만 사용하고 모르면 모른다고 한다.")
confidence: float = Field(
ge=0.0,
le=1.0,
description="context 가 질문을 직접 뒷받침하면 0.85+, 부분적 근거면 ≤0.7.",
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants